/** 
 * @file 1.模板1.cpp
 * @author 18-工程视觉-黄星照
 * @brief 阅读下列代码，简述下列代码原理
 *        (可选)讨论如何拓展，使得自定义的print函数可以接受任意个参数并用printf输出。
 * @date 2020-09-25
 */

/**
 * 
 * 模板声明
 * 特例化
 * 实例化
 * 
 * 将print写成可变参数模板，再利用递归解包
 */
#include <iostream>
#include <string.h>
template <class Ty>
char* getTy(Ty arg);

template <>
char* getTy<int>(int) { return "%d\n"; };

template <>
char* getTy<double>(double) { return "%f\n"; };

template <>
char* getTy<char*>(char*) { return "%s\n"; };

template <>
char* getTy<void *>(void *) { return "%p\n"; };

template <class Ty>
void print(Ty arg)
{
    printf(getTy(arg), arg);
};

int main(int argc, char **argv)
{
    int i = 1;
    double f = 1.2f;
    char *a = "ser";
    void *p = a;
    print(i);
    print(f);
    print(a);
    print(p);
}